package com.dbms.parser;

/**
 * 四元式类（中间代码表示结构）
 * 用于SQL解析过程中生成中间代码，是编译器/解析器常用的中间表示形式
 * 存储单个操作的核心信息：操作符、两个操作数及结果，通过编号维护执行顺序
 */
public class Quaternion {
    // 操作符：表示当前四元式要执行的操作类型
    // 示例：算术运算(+, -, *, /)、比较运算(=, >, <, !=)、SQL逻辑操作(AND, OR)、
    //      数据访问(GET_COL, CONST)、控制流操作(JMP, JMP_IF)等
    private String operator;

    // 第一个操作数：操作所需的第一个输入值
    // 可能的类型：表列名(如"user.id")、常量(如"100")、临时变量(如"t1")、空值(null，单目操作时)
    private String arg1;

    // 第二个操作数：操作所需的第二个输入值
    // 类型同arg1，单目操作（如NOT）或无输入操作时可为null
    private String arg2;

    // 结果存储变量：用于保存当前操作的执行结果
    // 通常是临时变量名（如"t2"），后续操作可引用此变量作为输入
    private String result;

    // 四元式编号：唯一标识每个四元式，用于维护执行顺序、追踪操作依赖关系
    private int id;

    /**
     * 构造方法：初始化四元式的核心操作信息（不含编号）
     * 四元式编号需通过{@link #setId(int)}方法后续分配（通常由中间代码生成器统一编号）
     * @param operator 操作符（如"+"、"="、"AND"）
     * @param arg1 第一个操作数（可为null，如单目操作）
     * @param arg2 第二个操作数（可为null，如单目操作或无输入操作）
     * @param result 结果存储变量（不可为null，需明确结果存放位置）
     */
    public Quaternion(String operator, String arg1, String arg2, String result) {
        this.operator = operator;
        this.arg1 = arg1;
        this.arg2 = arg2;
        this.result = result;
    }

    /**
     * 设置四元式的唯一编号
     * @param id 用于排序和追踪的编号（通常从1开始递增）
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * 重写toString方法：格式化输出四元式信息
     * 便于日志打印、调试分析，格式为「编号 (操作符, 操作数1, 操作数2, 结果)」
     * @return 格式化的四元式字符串
     */
    @Override
    public String toString() {
        return String.format("%d (%s, %s, %s, %s)",
                id, operator, arg1, arg2, result);
    }

    /**
     * 获取操作符
     * @return 当前四元式的操作符字符串
     */
    public String getOperator() {
        return operator;
    }

    /**
     * 获取第一个操作数
     * @return 第一个操作数（可能为null）
     */
    public String getArg1() {
        return arg1;
    }

    /**
     * 获取第二个操作数
     * @return 第二个操作数（可能为null）
     */
    public String getArg2() {
        return arg2;
    }

    /**
     * 获取结果存储变量
     * @return 存储当前操作结果的变量名
     */
    public String getResult() {
        return result;
    }

    /**
     * 获取四元式编号
     * @return 唯一标识当前四元式的编号
     */
    public int getId() {
        return id;
    }
}